package com.tuoyu.peopletest.utils;

import android.os.Handler;
import android.os.Looper;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 线程池的管理类： 单例
 * 
 */
public class MyThreadPoolUtils {


	private MyThreadPoolUtils() {
	}

	private static MyThreadPoolUtils instance;

	public synchronized static MyThreadPoolUtils get() {
		if (instance == null) {
			instance = new MyThreadPoolUtils();
		}
		return instance;
	}

	// 线程池
	private ThreadPoolExecutor mExecutor;

	// new Thread();
	// 注意:线程池中线程的创建完全是由线程池中的逻辑来完成的，并不是由用户来完成的。
	// 我们所需要做的事情是往这个池子里面丢一个又一个的任务
	// 分模块：下载的模块
	public void execute(Runnable r) {

		if (mExecutor == null) {
			// 创建线程池
			// 1、corePoolSize核心线程数：在正常的情况下，线程池中线程的数量
			// 2、maximumPoolSize最大线程数：在非正常的情况下(指的就是workqueue满了的情况下)，线程池中线程的数量
			// 3、keepAliveTime：空闲时间
			// 4、unit：指的是空闲时间的单位
			// 5、workQueue：等待区域
			// 6、threadFactory：线程工厂：创建线程
			// 7、handler：异常处理机制
			int cpuCounts = Runtime.getRuntime().availableProcessors();
			int corePoolSize = cpuCounts * 2 + 1;

			mExecutor = new ThreadPoolExecutor(cpuCounts, corePoolSize, 0, TimeUnit.SECONDS,
					new ArrayBlockingQueue<Runnable>(400), Executors.defaultThreadFactory(),
					new ThreadPoolExecutor.AbortPolicy());

		}


		if(mExecutor !=null){
			// 把任务丢到线程池中
			mExecutor.execute(r);
		}else {
			// 线程池获取失败，则直接使用线程
			new Thread(r).start();
		}

	}
	
	public void cancel(Runnable r) {
		if(r != null&&mExecutor!=null) {
			mExecutor.getQueue().remove(r);
		}
	}

	/**
	 * 在主线程中执行
	 * @param runnable 要执行的runnable
	 */
	public void excuteInMainThread(Runnable runnable){
		new Handler(Looper.getMainLooper()).post(runnable);
	}

}
